package cn.javasea.rbac.shiro.session;

import org.apache.shiro.web.servlet.ShiroHttpServletRequest;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.util.WebUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.Serializable;
import java.util.Objects;

/**
 *@ClassName CustomSessionManager
 *@Description 自定义的SessionManager, 继承DefaultWebSecurityManager，默认是 session 是http的session中
 *@Author longxiaonan@163.com
 *@Date 2021/7/6 0006 11:32
 */
public class CustomSessionManager extends DefaultWebSessionManager {

    /**
     * 指定 sessionid的获取方式
     * 默认session是从cookie中获取的。改 为 从请求头中获取。
     */
    @Override
    protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
        // 获取请求头Authorization中的数据
        String sessionId = WebUtils.toHttp(request).getHeader("Authorization");
        if (Objects.isNull(sessionId)) {
            // 如果没有携带，生成新的sessionId
            return super.getSessionId(request, response);
        } else {
            // 返回sessionId
            // 从源码中copy过来，需要添加到request的一些数据
            // sessionid来源
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, "header");
            // sessionid是啥
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sessionId);
            // sessionid是否需要验证
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
            return sessionId;
        }
    }
}
